// 实现前端一个并发请求控制函数

// 输入URL数组 和 限制请求数
// 按照 限制请求数 控制前端同时可以并发请求数量
// 请求操作直接用 window.fetch

async function concurrentRequests(urls, limit) {
  // 存储所有请求的结果
  const results = [];
  // 存储当前正在进行的请求
  const inFlightRequests = [];

  // 发起单个请求的异步函数
  async function makeRequest(url) {
    try {
      // 使用 fetch 发起请求
      const response = await fetch(url);
      // 解析响应为 JSON 格式
      const data = await response.json();
      // 将获取到的数据存入结果数组
      results.push(data);
    } catch (error) {
      // 如果请求失败，将错误信息存入结果数组
      results.push({ error: error.message });
    }
  }

  // 遍历所有的 URL
  for (let i = 0; i < urls.length; i++) {
    // 发起请求并将返回的 Promise 添加到当前请求数组
    const request = makeRequest(urls[i]);
    inFlightRequests.push(request);

    // 如果当前正在进行的请求数量达到了限制，或者已经处理完所有的 URL，则等待所有请求完成
    if (inFlightRequests.length === limit || i === urls.length - 1) {
      await Promise.all(inFlightRequests);
      // 清空当前请求数组，以便下一轮循环使用
      inFlightRequests.length = 0;
    }
  }

  // 返回所有请求的结果
  return results;
}

// 示例用法
const urls = [
  "https://api.example.com/data1",
  "https://api.example.com/data2",
  "https://api.example.com/data3",
  // 添加更多的 URL
];
const limit = 2;

// 使用并发请求函数获取数据
concurrentRequests(urls, limit)
  .then((results) => console.log(results))
  .catch((error) => console.error(error));
